package com.zhuo.controller;


import com.zhuo.bean.Person;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RestController
public class HelloController {

    @RequestMapping("/1.jpg")
    public String hello(@RequestParam("username") String name){ //从请求参数拿到username并赋值给name
        return "hello World!";
    }
    //请求进来，先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面

    //car/1 --->获取一号汽车的数据
    @GetMapping("/car/{id}/owner/{username}")
    public Map<String,Object> getCar(@PathVariable("id") Integer id,        //{@PathVariable("id") 获取路径变量的值，按照路径上的变量自动变化
                                     @PathVariable("username") String name,
                                     @PathVariable Map<String,String> pv,
                                     @RequestHeader("User-Agent") String UserAgent,     //@RequestHeader("User-Agent") 获取请求偷 User-Agent
                                     @RequestHeader Map<String,String> header,          //@RequestHeader 获取所有请求头，并封装到map里
                                     @RequestParam("age") Integer age,
                                     @RequestParam("inters")List<String> inters,
                                     @RequestParam Map<String,String> params,
                                     @CookieValue("_ga") String _ga,        //@CookieValue("_ga")获取Cookie的值
                                     @CookieValue("_ga") Cookie cookie){
        Map<String,Object> map = new HashMap<>();
//        map.put("id",id);
//        map.put("name",name);
//        map.put("pv",pv);
//        map.put("UserAgent",UserAgent);
//        map.put("herder",header);
        map.put("age",age);
        map.put("inters",inters);
        map.put("params",params);
        map.put("_ga",_ga);
        map.put("cookie",cookie);
        return map;
    }

    @PostMapping("/save")
    public Map postMethod(@RequestBody String content){     //获取请求体的内容
        Map<String,Object> map = new HashMap<>();
        map.put("content",content);
        return map;
    }

    // 矩阵变量语法： /cars/sell;low=34;brand=byd,audi,yd
    //  SpringBoot 默认禁用矩阵变量的功能，需要手动开启：
    //          原理：对于整个路径的处理，都是使用UrlPathHelper进行解析的，removeSemicolonContent （移除分号内容）支持矩阵变量的
    //注意：矩阵变量是要绑定在路径变量中的
    @RequestMapping("cars/{path}")
    public Map carsSell(@MatrixVariable("low") Integer low,
                        @MatrixVariable("brand") List<String> brand,
                        @PathVariable("path")String path){
        Map<String,Object> map = new HashMap<>();
        map.put("low",low);
        map.put("brand",brand);
        map.put("path",path);
        return map;
    }

    //矩阵变量：  /boss/1;age=20/2;age=10
    //矩阵变量必须有url路径变量才能被解析
    @GetMapping("/boss/{bossId}/{empId}")
    public Map Boss(@MatrixVariable(value = "age",pathVar = "bossId") Integer bossAge,
                    @MatrixVariable(value = "age",pathVar = "empId")Integer empAge){
        Map<String,Object> map = new HashMap<>();
        map.put("boosAge",bossAge);
        map.put("empAge",empAge);
        return map;
    }

    /**
     * 数据绑定：页面提交的请求数据（Get、Post）都可以和对象进行数据绑定
     * 自定义类型参数是通过ServletModelAttributeMethodProcessor
     * @param person
     * @return
     */
    @PostMapping("/saveUser")
    public Person saveUser(Person person){
        return person;
    }

}

/**
 * 参数解析器-HandlerMethodArgumentResolver
 *      确定将要执行的目标方法的每一个参数的值是什么;
 *      SpringMVC目标方法能写多少参数类型，却决于参数解析器argumentResolver（26个）
 *
 * 如何确定目标方法每一个参数的值
 *      挨个遍历循环，判断所有参数解析器哪个支持解析这个参数
 *      解析这个参数的值 调用各自 HandlerMethodArgumentResolver 的 resolveArgument 方法即可
 *
 *
 * 返回值处理器returnValueHandler
 *      SpringMVC目标方法能返回多少中返回值，去雀语返回值处理器（15个）
 *
 */
